בתרגום מאנגלית הכוונה ל—"ישיבה". מה הכוונה לישיבה בתרגום מ-php ?
המילה היחידה הזו היא ההסבר לאיך השרת יודע שאתם זה אתם ולא מישהו אחר.
אחרי שלמדנו מה זה קוקי (ואם עוד לא למדנו, זה הזמן!!) אפשר להתקדם הלאה.
הספרייה העירונית
דמיינו לרגע שעשיתם מנוי בספריה העירונית. בפעם הראשונה שביקרתם בספריה הזדהיתם עם שם ושם משפחה, רשמו אתכם למחשב המרכזי ובתמורה קיבלתם "כרטיס קורא", כרטיס שנושא בגאווה את שמכם ומספר הקורא שלכם לצד הלוגו של הספרייה עצמה.
יום למחרת אתם נכנסים לספריה, בוחרים ספר וניגשים לספרנית. הספרנית מחייכת ומבקשת לראות את כרטיס הקורא. היא מעתיקה את מספר הקורא למחשב, מעלה את נתוני הקורא שלכם, מוסיפה לרשומה ספר, מברכת אתכם לשלום ושוכחת מכם לגמרי כדי לטפל בלקוח הבא בתור.
מזכיר לכם את הקוקיז?
בביקור הראשון שלכם נתנו לכם מדבקה(, כרטיס, קוקי) עם המספר קורא שלכם.
כל ביקור הבא לספריה אתם תבואו עם אותו כרטיס (קוקי) ותציגו אותו לספרנית.
בדומה לקוקי תוכלו לחזור הביתה, לקחת טיפקס ובשקט לשנות את מספר הקורא למספר אחר. או תוכלו לבוא לספריה בלי הקוקי (בלי הכרטיס) ואף אחד לא ידע שאתם זה אתם.
עכשיו תסתכלו שוב על הכרטיס קורא בבקשה. כתוב עליו רק המספר קורא שלכם. לא רשום איזה ספרים השאלתם, מתי תחזירו אותם או איפה אתם גרים. והנא באה השאלה הקשה. מוכנים?
איפה נשמרים הנתונים האלה?
התשובה די פשוטה. זה לא נמצא בכרטיס שלכם, אלה במסד נתונים של הספרייה.
והספרנית היא כמו תוכנה חכמה במטריקס.
בכל פעם שניגשים אליה, קוראת את המספר קורא מהכרטיס, מוציאה מהמסד את הנתונים עליכם ומכניסה אותם לזיכרון בראש כדי לבצעה את הבקשה שלכם.
כשתבואו בלי כרטיס קורא, התוכנה "ספרנית" תפעיל את התנאי המתאים ותציע לכם לעשות מנוי שנתי. ואם תשנו את מספר הקורא שלכם לאחד שלא קיים, היא תעשה עיניים גדולות ותיתקע.
עד עכשיו הכל היה מובן?
זהו, אתם מכירים את אופן הפעולה של "סשן" מבוסס על מסד נתונים.
סשן לא על בסיס מסד נתונים
נחזור 30 שנה אחורה כשכבר היו ספריות, אבל עוד לא היה להם מחשבים.
מה היה אז?
תופתעו לגלות שגם אז הכל עבד בדיוק באותה צורה. בזמן שהייתם מתקרבים לעמדת ההשאלה, הייתם כבר מחזיקים את כטריס הקורא שלכם בידיים מתוחות קדימה.
הספרנית הייתה רואה אתכם מרחוק עם הכרטיס, זריז מוצאת את טופס הלקוח שלכם בין שאר הטפסים במגירת המסמכים, קוראת ממנו את הנתונים עליכם לזיכרון ופוגשת אתכם מוכנה ומזומנת לעבודה.
זה היה סשן המבוסס על דפים
סשן ב-php
ב-php יש חלק מובנה שדומה מאוד לספרנית ונקרא פונקציית — session_start שמבצעת את כל פעולות הספרנית בבת אחת.
בקריאה לפונקציה הזו - php בודקת לבד האם המשתמש בא עם קוקי (כרטיס קורא).
אם לא -> היא יוצרת ושולחת לו קוקי בעצמה (יוצרת מנוי חדש).
אם כן -> היא ניגשת למקום האחסון הפנימי שלה ומחפשת שם את כל הנתונים שיש לה על אותו משתמש.
את כל מה שהיא מצאה היא טוענת למשתנה מיוחד: $_SESSION
קוקי על בסיס קבצים ומספר קורא מסובך
ב-php מנגנון הסשן מבוסס על קבצים. במקום לשמור נתונים על כל משתמש במסד נתונים — היא שומרת אותם כקבצים (בתיקיה זמנית של השרת).
בדוגמה שלנו מספר הקורא שלי היה 123.
היה לי די קל לשנות אותו ל 124 וכנראה שהייתי מנחש מספר קורא של מישהו אחר.
phpsessid
כדי לא לאפשר התחזות למשתמש אחר php נותנת לכל לקוח מזהה (מספר קורא) ארוך יותר ומסובך. בדרך כלל זהו רצף של 32 אותיות ומספרים שרירותיים. לנחש רצף של 32 תווים אצל משתמש אחר בלתי אפשרי.
מזהה זה נשמר לרוב בקוקי עם השם PHPSESSID.
תוכלו לראות שהדפדפן שלכם שומר קוקי עם שם כזה גם עבור phpguide.co.il
והערך בו יכול להיות דומה לזה: PHPSESSID=7dfe29a9c4945ca2a287c528031538c9
כל פעם שאני גולש לאתר הזה, הדפדפן שלי מראה ל-php את ה-phpsessid שלי,
php לבד הולכת לבדוק האם יש לה קובץ עם השם הזה בדיוק בתיקיה הזמנית
ואם כן - טוענת את כל תוכן הקובץ הזה למערך $_SESSION
אם הסקריפט שינה ערך כלשהו במערך, בסיום הסקריפט php תדאג לבד לשמור את התוכן החדש של המערך לקובץ, כדי שבפעם הבאה המערך יכיל כבר את הנתונים החדשים.
אורך החיים של סשן
משך החיים של סשן הוא ל"ישיבה אחת" בלבד.
לכל קוקי יש זמן חיים כלשהו. לקוקי של סשן זמן החיים מוגבל עד לסגירת הדפדפן הקרובה. ברגע שסגרתם את הדפדפן, הקוקי phpsessid נמחק. כלומר כל עוד אתם יושבים מול הדפדפן — הקוקי קיים, אחרי שקמתם — זהו.
מכאן בא השם: ישיבה-סשן
אפילו אם השארתם את הדפדפן פתוח כל הלילה אבל לא ביצעתם בקשות לשרת בשמך 25 דקות, והשרת לא קיבל בקשות חדשות מכם, הוא ימחק את קובץ הקוקי בעצמו.
כלומר קובץ הקוקי בדפדפן יחיה עד שתסגרו את הדפדפן. והקובץ יהיה קיים בשרת למשך 25 דקות מהבקשה האחרונה שלכם. כשאחד מהם ימחק — סופו של הסשן.
השימושים של סשן
ברוב המקרים מסתכמים בהתחברות לאתר ושמירת נתונים לתווך הקצר.
ולסיכום כל הטקסט הזה בשני פסקאות:
php יוצרת קוקי עם id ייחודי וקובץ עם אותו השם. כל פעם שהמשתמש גולש אל העמוד, php קוראת את ה-id מהקוקי ומחפשת קובץ עם שם זהה בתיקיה מיוחדת. את תוכן הקובץ היא מכניסה למשתנה $_SESSION שאיתו אפשר לעבוד.
בסוף הסקריפט PHP רושמת את הנתונים שהשתנו מהמשתנה אל הקובץ ובגלישה הבאה שוב תטען אותם למערך. משך החיים של סשן הוא עד סגירת הדפדפן או 25 דקות של חוסר פעילות באתר (המוקדם מביניהם).
זהו זה, רשמו בתגובות איך אתם משתמשים בסשן, טיפים ושאלות אם יש.
אשמח לענות :-)
תגובות לכתבה:
וואו! מדריך מעולה ומפורט. קראתי את כולו. כתוב בצורה מדהימה :). המשך כך!
תודה רבה :)
מדריך יפה מאוד,
כל הכבוד על ההשקעה המתמדת שלך.
יש לי שאלה;
אם הקובץ ניתן לרשות הקבצים הזמניים של הדפדפן, זה אומר שהמשתמש יכול לשנות בסשן פרטים? תודה!
הקובץ נמצא במחשב של השרת. אצל הדפדפן נמצאת רק המדבקה (הקוקי). בספריה הנתונים עליך נשמרים בספריה ואצלך יש רק כרטיס קרוא עם מספר קורא
אז לכן הדפדפן לפעמים מרענן את העמוד לבד כל כמה דקות?
כדי למנוע מחיקה של הקוקי מצד השרת?
הדפדפן אף פעם לא עושה את זה לבד. אולי קוד ה javascript של האתר עושה את זה, אבל הדפדפן עצמו לא עושה את זה. שום דפדפן.
שלום אלכס,
כיצד ניתן להגדיר את משך זמן החיים עבור SESSION?
שדיברת עך אורך זמן החיים של SESSION התכוונת עד שהקוקי נמחק ואז מוחק על הדרך את הקובץ הנמצא בשרת, או שרק הSESSION נמחק והעוגייה נשארת, או שניהם ביחד? האם בזה שאני ישנה את אורך החיים של העוגייה בשם phpsessid כך גם ישתנה הקוקי, או שהוא נמחק אחרי 25 דקות וזהו? תודה...
כך גם ישתנה בSESSION..... טעות בכתיבה... סליחה
הקוקי בדפדפן לא יכול בשום אופן למחוק קבצים בשרת.
יש שני קבצים נפרדים שמשתתפים במנגנון הזה.
קובץ קוקי שנמצא במחשב של הדפדפן ותקף עד סגירת הדפדפן.
קובץ סשן בשרת שתקף ל25 דקות מהפעולה האחרונה.
ברגע שאחד מהם נעלם - המנגנון מפסיק לפעול. (במקום הקבצים הישנים נוצרים קבצים חדשים והכל חוזר שוב).
כדי להאריך את זמן החיים של קובץ הסשן יש לשנות בקובץ php.ini את הערך של session.gc_maxlifetime = 1440 לכמות שניות אחרת. 1440 שניות = 25 דקות.
עשיתי כפתור יציאה מהאתר שמבצע מחיקת סשן,
עכשיו אני מתחבר לאתר ואז סוגר את הדפדפן (ללא לחיצה על התנתקות) באקספלור ופפירפוקס זה מתנתק
ובכרום לא!
ניסיתי להוסיף לזה גם מחיקת קוקי ועשיין הכרום עקשן
(עשיתי UNSET ולאחריו DESTROY ואחריו מחיקת קוקי ואז HEADER-LOCATION)
>>> מחיקת קוקי ו*עשיין* הכרום עקשן
*** *ועדיין*
מדריך מעולה הסבר מפורט ומלא.